
import 'package:intl/intl.dart';

class DateTool{


  static DateFormat DF_DD_MMM_YYYY=DateFormat("dd MMM yyyy");
  static DateFormat DF_DD_MM_YYYY=DateFormat("dd-MM-yyyy");
  static DateFormat DF_YYYY_MM_DD=DateFormat("yyyy-MM-dd");
  static DateFormat DF_YYYY_MM_DD2=DateFormat("yyyy MM dd");

  static DateFormat DF_MMM_YY=DateFormat("MMM yyyy");
  static DateFormat DF_YMDHMS=DateFormat("yyyy-MM-dd HH:mm:ss");
  static DateFormat DF_YMDHM=DateFormat("yyyy-MM-dd HH:mm");

  static DateFormat DF_MDHM=DateFormat("MM-dd HH:mm");

  static DateFormat DF_HM=DateFormat("HH:mm");
  static DateFormat DF_YMD=DateFormat("yyyy-MM-dd");
  static DateFormat DF_DD=DateFormat("dd");
  static DateFormat DF_MM=DateFormat("MM");
  static DateFormat DF_HH=DateFormat("HH");
  static DateFormat DF_YYYY_MM=DateFormat("yyyy-MM");
  static DateFormat DD_MMM_YYYY_EEEE = DateFormat('dd MMM, yyyy, EEEE');

  static DateFormat DD_MMM_YYYY_EEEE_HH_MM = DateFormat('dd MMM, yyyy, HH:mm');
  static DateFormat DD_MMM_YYYY_EEEE_HH_MM2 = DateFormat('dd MMM yyyy, HH:mm');


  static DateFormat DD_MM_YY_HH_MM_SS = DateFormat('dd/MM/yyyy HH:mm:ss');
  static DateFormat DD_MM_YY_HH_MM = DateFormat('dd/MM/yyyy HH:mm');

  static DateFormat EEE_MMM_D = DateFormat('EEEE, MMM d');



  /// 获取指定季度的整体起止时间（DateTime），共12个完整周
  /// [offset]: 0 表示当前季度，-1 表示上季度，1 表示下季度
  static List<Map<String, DateTime>> getQuarterWeeks(DateTime date, {int offset = 0}) {
    int currentMonth = date.month;
    int currentYear = date.year;

    // 当前季度编号（0~3）
    int quarterIndex = ((currentMonth - 1) ~/ 3);

    // 目标季度编号和年份
    int targetQuarterIndex = quarterIndex + offset;
    int targetYear = currentYear;

    while (targetQuarterIndex < 0) {
      targetQuarterIndex += 4;
      targetYear -= 1;
    }
    while (targetQuarterIndex > 3) {
      targetQuarterIndex -= 4;
      targetYear += 1;
    }

    // 季度起始月
    int quarterStartMonth = targetQuarterIndex * 3 + 1;
    DateTime quarterStart = DateTime(targetYear, quarterStartMonth, 1);

    // 找到季度第一天所在周的周一
    int weekday = quarterStart.weekday;
    DateTime firstMonday = weekday == 1
        ? quarterStart
        : quarterStart.subtract(Duration(days: weekday - 1));

    // 构建 12 个周的起止日期
    List<Map<String, DateTime>> weekList = [];

    for (int i = 0; i < 12; i++) {
      DateTime weekStart = firstMonday.add(Duration(days: i * 7));
      DateTime weekEnd = weekStart.add(Duration(days: 6));

      weekList.add({
        'start': weekStart,
        'end': weekEnd,
      });
    }

    return weekList;
  }


  /// 获取某一周的 7 个日期（从周一开始）
  /// [weeksAgo] = 0 表示本周，1 表示上周，2 表示上上周...
  static List<DateTime> getWeekDates({int weeksAgo = 0}) {
    final now = DateTime.now();
    final today = DateTime(now.year, now.month, now.day);

    // 计算本周周一
    final mondayThisWeek = today.subtract(Duration(days: today.weekday - 1));

    // 计算目标周的周一
    final targetMonday = mondayThisWeek.subtract(Duration(days: 7 * weeksAgo));

    // 生成该周的 7 天（周一到周日）
    return List.generate(7, (i) => targetMonday.add(Duration(days: i)));
  }

  /// 获取某个月的所有日期（从该月1号开始）
  /// [monthsAgo] = 0 表示当前月，1 表示上个月，2 表示上上个月...
  /// 获取某个月的所有日期（从该月1号开始）
  /// [offset] = 0 表示当前月，-1 表示上个月，1 表示下个月，以此类推
  static List<DateTime> getMonthDates({int offset = 0}) {
    final now = DateTime.now();

    // 使用 DateTime 自动处理跨月跨年（例如 2025 年 12 月 + 1 = 2026 年 1 月）
    final DateTime firstDay = DateTime(now.year, now.month + offset, 1);

    // 下个月的第一天
    final DateTime nextMonth = DateTime(firstDay.year, firstDay.month + 1, 1);

    // 当前月的天数
    final int daysInMonth = nextMonth.difference(firstDay).inDays;

    // 生成整个月的所有日期
    return List.generate(daysInMonth, (i) => firstDay.add(Duration(days: i)));
  }

  /// 获取某个季度的所有日期
  /// [quartersAgo] = 0 表示当前季度，1 表示上一个季度，依此类推
  static  List<DateTime> getQuarterDates({int quartersAgo = 0}) {
    final now = DateTime.now();

    // 当前是第几个季度（1~4）
    final int currentQuarter = ((now.month - 1) ~/ 3) + 1;

    // 目标季度编号
    int targetQuarter = currentQuarter - quartersAgo;
    int targetYear = now.year;

    // 如果跨年了
    while (targetQuarter <= 0) {
      targetQuarter += 4;
      targetYear -= 1;
    }

    // 获取季度起始月
    final int startMonth = (targetQuarter - 1) * 3 + 1;

    // 该季度的第1天和第1天后的第3个月的1号
    final DateTime startDate = DateTime(targetYear, startMonth, 1);
    final DateTime nextQuarterStartDate = (startMonth + 3 > 12)
        ? DateTime(targetYear + 1, (startMonth + 3) % 12, 1)
        : DateTime(targetYear, startMonth + 3, 1);

    final int totalDays = nextQuarterStartDate.difference(startDate).inDays;

    // 返回整个季度的日期列表
    return List.generate(totalDays, (i) => startDate.add(Duration(days: i)));
  }


  /// 获取某一整年的所有日期
  /// [yearsAgo] = 0 表示当前年，1 表示去年，以此类推
  static List<DateTime> getYearDates({int yearsAgo = 0}) {
    final now = DateTime.now();
    final int targetYear = now.year - yearsAgo;

    final startDate = DateTime(targetYear, 1, 1);
    final endDate = DateTime(targetYear + 1, 1, 1); // 次年1月1日，不包含

    final int totalDays = endDate.difference(startDate).inDays;

    return List.generate(totalDays, (i) => startDate.add(Duration(days: i)));
  }

}